home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / ctlib100.zip / INSTALL.LZH / READERS.PAS < prev    next >
Pascal/Delphi Source File  |  1996-10-12  |  29KB  |  730 lines

  1. {**************************************************************************}
  2. {*  BitSoft Development, L.L.C.                                           *}
  3. {*  Copyright (C) 1995, 1996 BitSoft Development, L.L.C.                  *}
  4. {*  All rights reserved.                                                  *}
  5. {**************************************************************************}
  6.  
  7. unit Readers;
  8.  
  9. {$B-,T-}
  10.  
  11. interface
  12.  
  13. uses Objects, Views,
  14.      Containr, ctTrees, ctLists;
  15.  
  16. var
  17.   Packing : Boolean;
  18.  
  19. type
  20.   { Base reader }
  21.   PContainerReader = ^TContainerReader;
  22.   TContainerReader = object(TObject)
  23.       Container : PContainer;
  24.       Owner : PScroller;
  25.       HasChanged : Boolean;
  26.     constructor Init(AContainer : PContainer);
  27.     destructor Done; virtual;
  28.     function Count : string; virtual;
  29.     function ExtractIndex(Item : Pointer) : Integer; virtual;
  30.     function ExtractText(Item : Pointer) : PString; virtual;
  31.     function GetText(Index : LongInt) : string; virtual;
  32.     function OtherInfo : string; virtual;
  33.     procedure ShowItem(Item : Pointer);
  34.   end; { TContainerReader }
  35.  
  36. type
  37.   { Reader for stream based sequences }
  38.   PSequenceReader = ^TSequenceReader;
  39.   TSequenceReader = object(TContainerReader)
  40.     function GetText(Index : LongInt) : string; virtual;
  41.   end; { TStreamSequenceReader }
  42.  
  43. type
  44.   { Reader for containers using TNode descendants }
  45.   PNodeDataReader = ^TNodeDataReader;
  46.   TNodeDataReader = object(TContainerReader)
  47.     function ExtractText(Item : Pointer) : PString; virtual;
  48.   end; { TNodeDataReader }
  49.  
  50. type
  51.   { Reader for linked lists }
  52.   PListReader = ^TListReader;
  53.   TListReader = object(TNodeDataReader)
  54.       First : PListNode;
  55.       LowIndex : LongInt;
  56.     constructor Init(List : PList);
  57.     function GetText(Index : LongInt) : string; virtual;
  58.   end; { TListReader }
  59.  
  60. type
  61.   { Reader for memory trees }
  62.   PMemTreeReader = ^TMemTreeReader;
  63.   TMemTreeReader = object(TNodeDataReader)
  64.       First : PNode;
  65.       LowIndex : LongInt;
  66.     constructor Init(AContainer : PContainer);
  67.     function GetText(Index : LongInt) : string; virtual;
  68.     function OtherInfo : string; virtual;
  69.   end; { TMemTreeReader }
  70.  
  71. { Data specific readers }
  72.  
  73. type
  74.   PTestRecReader = ^TTestRecReader;
  75.   TTestRecReader = object(TSequenceReader)
  76.     function ExtractText (Item : Pointer) : PString; virtual;
  77.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  78.   end; { TTestRec }
  79.  
  80. type
  81.   PTestObjectReader = ^TTestObjectReader;
  82.   TTestObjectReader = object(TSequenceReader)
  83.     function ExtractText (Item : Pointer) : PString; virtual;
  84.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  85.   end; { TTestObjectReader }
  86.  
  87. type
  88.   PTestStaticObjectReader = ^TTestStaticObjectReader;
  89.   TTestStaticObjectReader = object(TSequenceReader)
  90.     function ExtractText (Item : Pointer) : PString; virtual;
  91.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  92.   end; { TTestStaticObjectReader }
  93.  
  94. type
  95.   PStringReader = ^TStringReader;
  96.   TStringReader = object(TSequenceReader)
  97.     function ExtractText (Item : Pointer) : PString; virtual;
  98.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  99.   end; { TStringReader }
  100.  
  101. type
  102.   PTestListNodeReader = ^TTestListNodeReader;
  103.   TTestListNodeReader = object(TListReader)
  104.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  105.   end; { TTestListNodeReader }
  106.  
  107. type
  108.   PTestDoubleNodeReader = ^TTestDoubleNodeReader;
  109.   TTestDoubleNodeReader = object(TListReader)
  110.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  111.   end; { TTestDoubleNodeReader }
  112.  
  113. type
  114.   PTestBinaryNodeReader = ^TTestBinaryNodeReader;
  115.   TTestBinaryNodeReader = object(TMemTreeReader)
  116.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  117.   end; { TTestBinaryNodeReader }
  118.  
  119. type
  120.   PTestAvlNodeReader = ^TTestAvlNodeReader;
  121.   TTestAvlNodeReader = object(TMemTreeReader)
  122.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  123.   end; { TTestAvlNodeReader }
  124.  
  125. type
  126.   PBTreeReader = ^TBTreeReader;
  127.   TBTreeReader = object(TContainerReader)
  128.       FirstKey : string[8];
  129.       LowIndex : LongInt;
  130.     constructor Init(AContainer : PContainer);
  131.     function GetText(Index : LongInt) : string; virtual;
  132.     function ExtractText (Item : Pointer) : PString; virtual;
  133.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  134.     function OtherInfo : string; virtual;
  135.   end; { TBTreeReader }
  136.  
  137. type
  138.   PObjectBTreeReader = ^TObjectBTreeReader;
  139.   TObjectBTreeReader = object(TBTreeReader)
  140.     function ExtractText (Item : Pointer) : PString; virtual;
  141.     function ExtractIndex (Item : Pointer) : Integer; virtual;
  142.   end; { TObjectBTreeReader }
  143.  
  144. implementation
  145.  
  146. uses ctCollec, ctBiTree,
  147.      Utils, Data;
  148.  
  149. {****************************************************************************}
  150. { TBTreeReader object                                                        }
  151. {****************************************************************************}
  152. {****************************************************************************}
  153. { TBTreeReader.Init                                                          }
  154. {****************************************************************************}
  155. constructor TBTreeReader.Init(AContainer : PContainer);
  156. begin
  157.   TContainerReader.Init(AContainer);
  158.   FirstKey := '';
  159.   LowIndex := 0;
  160. end;
  161.  
  162. {****************************************************************************}
  163. { TBTreeReader.GetText                                                       }
  164. {****************************************************************************}
  165. function TBTreeReader.GetText(Index : LongInt) : string;
  166. var
  167.   CurrNode : PNode;
  168.   CurrIndex : LongInt;
  169.   StrIndex : string;
  170.   First : Pointer;
  171.  
  172.   procedure SetFirstKey(Item : Pointer);
  173.   begin
  174.     FirstKey := ExtractText(Item)^;
  175.   end; { SetFirstKey }
  176.  
  177.   procedure SetFirst;
  178.   var
  179.     CurrNodeIndex : LongInt;
  180.  
  181.     function MatchIndexInc(Item: Pointer) : Boolean; far;
  182.     begin
  183.       if CurrNodeIndex = Owner^.Delta.Y
  184.         then MatchIndexInc := True
  185.         else MatchIndexInc := False;
  186.       Inc(CurrNodeIndex);
  187.     end; { MatchIndex }
  188.  
  189.     function MatchIndexDec(Item: Pointer) : Boolean; far;
  190.     begin
  191.       if CurrNodeIndex = Owner^.Delta.Y
  192.         then MatchIndexDec := True
  193.         else MatchIndexDec := False;
  194.       Dec(CurrNodeIndex);
  195.     end; { MatchIndex }
  196.  
  197.   begin
  198.     if Index <= (Container^.Count div 2)
  199.       then begin
  200.              CurrNodeIndex := 0;
  201.              SetFirstKey(PGraph(Container)^.FirstThat(@MatchIndexInc))
  202.            end { if }
  203.       else begin
  204.              CurrNodeIndex := Pred(Container^.Count);
  205.              SetFirstKey(PGraph(Container)^.LastThat(@MatchIndexDec))
  206.            end; { else }
  207.     First := PGraph(Container)^.KeyFirst(@FirstKey);
  208.     HasChanged := False;
  209.   end; { SetFirst }
  210.  
  211. begin
  212.   if (Container = nil) or (Index >= Container^.Count)
  213.     then GetText := ''
  214.     else begin
  215.            PGraph(Container)^.ExactMatch := False;
  216.            if (FirstKey = '') or HasChanged
  217.              then SetFirst
  218.            else if Owner^.Delta.Y < LowIndex
  219.              then if (LowIndex - Owner^.Delta.Y) < Owner^.Delta.Y
  220.                     then begin
  221.                            First := PGraph(Container)^.KeyFirst(@FirstKey);
  222.                            while LowIndex <> Owner^.Delta.Y do
  223.                            begin
  224.                              First := PGraph(Container)^.Prev(First);
  225.                              Dec(LowIndex);
  226.                            end; { while }
  227.                            SetFirstKey(First);
  228.                          end { if }
  229.                     else SetFirst
  230.            else if Owner^.Delta.Y > LowIndex
  231.              then if (Owner^.Delta.Y - LowIndex) < (Pred(Container^.Count) -
  232.                      Owner^.Delta.Y)
  233.                     then begin
  234.                            First := PGraph(Container)^.KeyFirst(@FirstKey);
  235.                            while LowIndex <> Owner^.Delta.Y do
  236.                            begin
  237.                              First := PGraph(Container)^.Next(First);
  238.                              Inc(LowIndex);
  239.                            end; { while }
  240.                            SetFirstKey(First);
  241.                          end { if }
  242.                     else SetFirst
  243.              else First := PGraph(Container)^.KeyFirst(@FirstKey);
  244.            LowIndex := Owner^.Delta.Y;
  245.            CurrIndex := LowIndex;
  246.            CurrNode := First;
  247.            while CurrIndex <> Index do
  248.            begin
  249.              CurrNode := PGraph(Container)^.Next(CurrNode);
  250.              Inc(CurrIndex);
  251.            end; { while }
  252.            Str(Index, StrIndex);
  253.            if ExtractText(CurrNode) <> nil
  254.              then GetText := ExtractText(CurrNode)^+' ['+StrIndex+']'
  255.              else GetText := 'n/a ['+StrIndex+']';
  256.        end; { else }
  257. end;
  258.  
  259.  
  260. {****************************************************************************}
  261. { TBTreeReader.ExtractText                                                   }
  262. {****************************************************************************}
  263. function TBTreeReader.ExtractText(Item : Pointer) : PString;
  264. begin
  265.   if Item <> nil
  266.     then ExtractText := @(PTestRec(Item)^.Key)
  267.     else ExtractText := nil;
  268. end;
  269.  
  270. {****************************************************************************}
  271. { TBTreeReader.ExtractIndex                                                  }
  272. {****************************************************************************}
  273. function TBTreeReader.ExtractIndex(Item : Pointer) : Integer;
  274. begin
  275.   if Item <> nil
  276.     then ExtractIndex := PTestRec(Item)^.Index
  277.     else ExtractIndex := 0;
  278. end;
  279.  
  280. {****************************************************************************}
  281. { TBTreeReader.OtherInfo                                                     }
  282. {****************************************************************************}
  283. function TBTreeReader.OtherInfo : string;
  284. var
  285.   HeightStr : string;
  286. begin
  287.   if Container <> nil
  288.     then Str(PTree(Container)^.Height, HeightStr)
  289.     else HeightStr := 'n/a';
  290.   OtherInfo := 'Height: '+HeightStr;
  291. end;
  292.  
  293. {****************************************************************************}
  294. { TContainerReader object                                                    }
  295. {****************************************************************************}
  296. {****************************************************************************}
  297. { TContainerReader.Init                                                      }
  298. {****************************************************************************}
  299. constructor TContainerReader.Init(AContainer : PContainer);
  300. begin
  301.   TObject.Init;
  302.   Container := AContainer;
  303.   Owner := nil;
  304.   HasChanged := False;
  305. end;
  306.  
  307. {****************************************************************************}
  308. { TContainerReader.Done                                                      }
  309. {****************************************************************************}
  310. destructor TContainerReader.Done;
  311. begin
  312.   if Container <> nil
  313.     then Dispose(Container, Done);
  314.   TObject.Done;
  315. end;
  316.  
  317. {****************************************************************************}
  318. { TContainerReader.Count                                                     }
  319. {****************************************************************************}
  320. function TContainerReader.Count : string;
  321. var
  322.   CountStr : string;
  323. begin
  324.   if Container <> nil
  325.     then Str(Container^.Count, CountStr)
  326.     else CountStr := 'n/a';
  327.   Count := CountStr;
  328. end;
  329.  
  330. {****************************************************************************}
  331. { TContainerReader.ExtractIndex                                              }
  332. {****************************************************************************}
  333. function TContainerReader.ExtractIndex(Item : Pointer) : Integer;
  334. begin
  335.   Abstract;
  336. end;
  337.  
  338. {****************************************************************************}
  339. { TContainerReader.ExtractText                                               }
  340. {****************************************************************************}
  341. function TContainerReader.ExtractText(Item : Pointer) : PString;
  342. begin
  343.   Abstract;
  344. end;
  345.  
  346. {****************************************************************************}
  347. { TContainerReader.GetText                                                   }
  348. {****************************************************************************}
  349. function TContainerReader.GetText(Index : LongInt) : string;
  350. begin
  351.   Abstract;
  352. end;
  353.  
  354. {****************************************************************************}
  355. { TContainerReader.OtherInfo                                                 }
  356. {****************************************************************************}
  357. function TContainerReader.OtherInfo : string;
  358. begin
  359.   OtherInfo := '';
  360. end;
  361.  
  362. {****************************************************************************}
  363. { TContainerReader                                                           }
  364. {****************************************************************************}
  365. procedure TContainerReader.ShowItem(Item : Pointer);
  366. var
  367.   StrIndex : string;
  368. begin
  369.   Str(ExtractIndex(Item), StrIndex);
  370.   if ExtractText(Item) <> nil
  371.     then Writeln(TestWindow^.T, ExtractText(Item)^ + ' (' + StrIndex +
  372.            ')':13)
  373.     else Writeln(TestWindow^.T, '(' + StrIndex + ')':13);
  374. end;
  375.  
  376. {****************************************************************************}
  377. { TListReader object                                                         }
  378. {****************************************************************************}
  379. {****************************************************************************}
  380. { TListReader.Init                                                           }
  381. {****************************************************************************}
  382. constructor TListReader.Init(List : PList);
  383. begin
  384.   TContainerReader.Init(List);
  385.   First := nil;
  386.   LowIndex := 0;
  387. end;
  388.  
  389. {****************************************************************************}
  390. { TListReader.GetText                                                        }
  391. {****************************************************************************}
  392. function TListReader.GetText(Index : LongInt) : string;
  393. var
  394.   CurrNode : PListNode;
  395.   CurrIndex : LongInt;
  396.   StrIndex : string;
  397. begin
  398.   if (Container = nil) or (Index >= Container^.Count)
  399.     then GetText := ''
  400.     else begin
  401.            if (First = nil) or HasChanged or (Owner^.Delta.Y <> LowIndex)
  402.              then begin
  403.                     First := PSequence(Container)^.At(Index);
  404.                     LowIndex := Owner^.Delta.Y;
  405.                     HasChanged := False;
  406.                   end; { if }
  407.            CurrIndex := LowIndex;
  408.            CurrNode := First;
  409.            while CurrIndex <> Index do
  410.            begin
  411.              CurrNode := PListNode(CurrNode)^.Next;
  412.              Inc(CurrIndex);
  413.            end; { while }
  414.            Str(Index, StrIndex);
  415.            if ExtractText(CurrNode) <> nil
  416.              then GetText := ExtractText(CurrNode)^+' ['+StrIndex+']'
  417.              else GetText := 'n/a ['+StrIndex+']'
  418.        end; { else }
  419. end;
  420.  
  421. {****************************************************************************}
  422. { TMemTreeReader object                                                      }
  423. {****************************************************************************}
  424. {****************************************************************************}
  425. { TMemTreeReader.Init                                                        }
  426. {****************************************************************************}
  427. constructor TMemTreeReader.Init(AContainer : PContainer);
  428. begin
  429.   TContainerReader.Init(AContainer);
  430.   First := nil;
  431.   LowIndex := 0;
  432. end;
  433.  
  434. {****************************************************************************}
  435. { TMemTreeReader.GetText                                                     }
  436. {****************************************************************************}
  437. function TMemTreeReader.GetText(Index : LongInt) : string;
  438. var
  439.   CurrNode : PNode;
  440.   CurrIndex : LongInt;
  441.   StrIndex : string;
  442.  
  443.   procedure SetFirst;
  444.   var
  445.     CurrNodeIndex : LongInt;
  446.  
  447.     function MatchIndexInc(Item: Pointer) : Boolean; far;
  448.     begin
  449.       if CurrNodeIndex = Owner^.Delta.Y
  450.         then MatchIndexInc := True
  451.         else MatchIndexInc := False;
  452.       Inc(CurrNodeIndex);
  453.     end; { MatchIndex }
  454.  
  455.     function MatchIndexDec(Item: Pointer) : Boolean; far;
  456.     begin
  457.       if CurrNodeIndex = Owner^.Delta.Y
  458.         then MatchIndexDec := True
  459.         else MatchIndexDec := False;
  460.       Dec(CurrNodeIndex);
  461.     end; { MatchIndex }
  462.  
  463.   begin
  464.     if Index <= (Container^.Count div 2)
  465.       then begin
  466.              CurrNodeIndex := 0;
  467.              First := PGraph(Container)^.FirstThat(@MatchIndexInc);
  468.            end { if }
  469.       else begin
  470.              CurrNodeIndex := Pred(Container^.Count);
  471.              First := PGraph(Container)^.LastThat(@MatchIndexDec);
  472.            end; { else }
  473.     HasChanged := False;
  474.   end; { SetFirst }
  475.  
  476. begin
  477.   if (Container = nil) or (Index >= Container^.Count)
  478.     then GetText := ''
  479.     else begin
  480.            PGraph(Container)^.ExactMatch := False;
  481.            if (First = nil) or HasChanged
  482.              then SetFirst
  483.            else if Owner^.Delta.Y < LowIndex
  484.              then if (LowIndex - Owner^.Delta.Y) < Owner^.Delta.Y
  485.                     then while LowIndex <> Owner^.Delta.Y do
  486.                          begin
  487.                            First := PGraph(Container)^.Prev(First);
  488.                            Dec(LowIndex);
  489.                          end { while }
  490.                     else SetFirst
  491.            else if Owner^.Delta.Y > LowIndex
  492.              then if (Owner^.Delta.Y - LowIndex) < (Pred(Container^.Count) -
  493.                      Owner^.Delta.Y)
  494.                     then while LowIndex <> Owner^.Delta.Y do
  495.                          begin
  496.                            First := PGraph(Container)^.Next(First);
  497.                            Inc(LowIndex);
  498.                          end { while }
  499.                     else SetFirst;
  500.            LowIndex := Owner^.Delta.Y;
  501.            CurrIndex := LowIndex;
  502.            CurrNode := First;
  503.            while CurrIndex <> Index do
  504.            begin
  505.              CurrNode := PGraph(Container)^.Next(CurrNode);
  506.              Inc(CurrIndex);
  507.            end; { while }
  508.            Str(Index, StrIndex);
  509.            if ExtractText(CurrNode) <> nil
  510.              then GetText := ExtractText(CurrNode)^+' ['+StrIndex+']'
  511.              else GetText := 'n/a ['+StrIndex+']';
  512.        end; { else }
  513. end;
  514.  
  515. {****************************************************************************}
  516. { TMemTreeReader.OtherInfo                                                   }
  517. {****************************************************************************}
  518. function TMemTreeReader.OtherInfo : string;
  519. var
  520.   HeightStr : string;
  521. begin
  522.   Str(PBinaryTree(Container)^.Height, HeightStr);
  523.   OtherInfo := 'Height: '+HeightStr;
  524. end;
  525.  
  526. {****************************************************************************}
  527. { TNodeDataReader object                                                     }
  528. {****************************************************************************}
  529. {****************************************************************************}
  530. { TNodeDataReader.ExtractText                                                }
  531. {****************************************************************************}
  532. function TNodeDataReader.ExtractText(Item : Pointer) : PString;
  533. begin
  534.   if Item <> nil
  535.     then ExtractText := PNode(Item)^.KeyOf
  536.     else ExtractText := nil;
  537. end;
  538.  
  539. {****************************************************************************}
  540. { TObjectBTreeReader object                                                  }
  541. {****************************************************************************}
  542. {****************************************************************************}
  543. { TObjectBTreeReader.ExtractText                                             }
  544. {****************************************************************************}
  545. function TObjectBTreeReader.ExtractText(Item : Pointer) : PString;
  546. begin
  547.   if Item <> nil
  548.     then ExtractText := @(PTestStaticObject(Item)^.Text)
  549.     else ExtractText := nil;
  550. end;
  551.  
  552. {****************************************************************************}
  553. { TObjectBTreeReader.ExtractIndex                                            }
  554. {****************************************************************************}
  555. function TObjectBTreeReader.ExtractIndex(Item : Pointer) : Integer;
  556. begin
  557.   if Item <> nil
  558.     then ExtractIndex := PTestStaticObject(Item)^.Index
  559.     else ExtractIndex := 0;
  560. end;
  561.  
  562.  
  563. {****************************************************************************}
  564. { TTestAvlNodeReader object                                                  }
  565. {****************************************************************************}
  566. {****************************************************************************}
  567. { TTestAvlNodeReader.ExtractIndex                                            }
  568. {****************************************************************************}
  569. function TTestAvlNodeReader.ExtractIndex(Item : Pointer) : Integer;
  570. begin
  571.   if Item <> nil
  572.     then ExtractIndex := PTestAvlNode(Item)^.Index
  573.     else ExtractIndex := 0;
  574. end;
  575.  
  576. {****************************************************************************}
  577. { TTestBinaryNodeReader object                                               }
  578. {****************************************************************************}
  579. {****************************************************************************}
  580. { TTestBinaryNodeReader.ExtractIndex                                         }
  581. {****************************************************************************}
  582. function TTestBinaryNodeReader.ExtractIndex(Item : Pointer) : Integer;
  583. begin
  584.   if Item <> nil
  585.     then ExtractIndex := PTestBinaryNode(Item)^.Index
  586.     else ExtractIndex := 0;
  587. end;
  588.  
  589. {****************************************************************************}
  590. { TTestDoubleNodeReader object                                               }
  591. {****************************************************************************}
  592. {****************************************************************************}
  593. { TTestDoubleNodeReader.ExtractIndex                                         }
  594. {****************************************************************************}
  595. function TTestDoubleNodeReader.ExtractIndex(Item : Pointer) : Integer;
  596. begin
  597.   if Item <> nil
  598.     then ExtractIndex := PTestDoubleNode(Item)^.Index
  599.     else ExtractIndex := 0;
  600. end;
  601.  
  602. {****************************************************************************}
  603. { TTestListNodeReader object                                                 }
  604. {****************************************************************************}
  605. {****************************************************************************}
  606. { TTestListNodeReader.ExtractIndex                                           }
  607. {****************************************************************************}
  608. function TTestListNodeReader.ExtractIndex(Item : Pointer) : Integer;
  609. begin
  610.   if Item <> nil
  611.     then ExtractIndex := PTestListNode(Item)^.Index
  612.     else ExtractIndex := 0;
  613. end;
  614.  
  615. {****************************************************************************}
  616. { TTestObjectReader object                                                   }
  617. {****************************************************************************}
  618. {****************************************************************************}
  619. { TTestObjectReader.ExtractText                                              }
  620. {****************************************************************************}
  621. function TTestObjectReader.ExtractText(Item : Pointer) : PString;
  622. begin
  623.   if Item <> nil
  624.     then ExtractText := PTestObject(Item)^.Text
  625.     else ExtractText := nil;
  626. end;
  627.  
  628. {****************************************************************************}
  629. { TTestObjectReader.ExtractIndex                                             }
  630. {****************************************************************************}
  631. function TTestObjectReader.ExtractIndex(Item : Pointer) : Integer;
  632. begin
  633.   if Item <> nil
  634.     then ExtractIndex := PTestObject(Item)^.Index
  635.     else ExtractIndex := 0;
  636. end;
  637.  
  638. {****************************************************************************}
  639. { TTestRecReader object                                                      }
  640. {****************************************************************************}
  641. {****************************************************************************}
  642. { TTestRecReader.ExtractText                                                 }
  643. {****************************************************************************}
  644. function TTestRecReader.ExtractText(Item : Pointer) : PString;
  645. begin
  646.   if Item <> nil
  647.     then ExtractText := @(PTestRec(Item)^.Key)
  648.     else ExtractText := nil;
  649. end;
  650.  
  651. {****************************************************************************}
  652. { TTestRecReader.ExtractIndex                                                }
  653. {****************************************************************************}
  654. function TTestRecReader.ExtractIndex(Item : Pointer) : Integer;
  655. begin
  656.   if Item <> nil
  657.     then ExtractIndex := PTestRec(Item)^.Index
  658.     else ExtractIndex := 0;
  659. end;
  660.  
  661. {****************************************************************************}
  662. { TTestStaticObjectReader object                                             }
  663. {****************************************************************************}
  664. {****************************************************************************}
  665. { TTestStaticObjectReader.ExtractText                                        }
  666. {****************************************************************************}
  667. function TTestStaticObjectReader.ExtractText(Item : Pointer) : PString;
  668. begin
  669.   if Item <> nil
  670.     then ExtractText := @(PTestStaticObject(Item)^.Text)
  671.     else ExtractText := nil;
  672. end;
  673.  
  674. {****************************************************************************}
  675. { TTestStaticObjectReader.ExtractIndex                                       }
  676. {****************************************************************************}
  677. function TTestStaticObjectReader.ExtractIndex(Item : Pointer) : Integer;
  678. begin
  679.   if Item <> nil
  680.     then ExtractIndex := PTestStaticObject(Item)^.Index
  681.     else ExtractIndex := 0;
  682. end;
  683.  
  684. {****************************************************************************}
  685. { TStreamSequenceReader object                                               }
  686. {****************************************************************************}
  687. {****************************************************************************}
  688. { TStreamSequenceReader.GetText                                              }
  689. {****************************************************************************}
  690. function TSequenceReader.GetText(Index : LongInt) : string;
  691. var
  692.   Item : Pointer;
  693.   StrIndex : string;
  694. begin
  695.   if (Container <> nil) and (Index < Container^.Count)
  696.     then begin
  697.            Item := PSequence(Container)^.At(Index);
  698.            Str(Index, StrIndex);
  699.            if Item <> nil
  700.              then if ExtractText(Item) <> nil
  701.                     then GetText := ExtractText(Item)^+' ['+StrIndex+']'
  702.                     else GetText := '['+StrIndex+']'
  703.              else GetText := ' nil/deleted'+' ['+StrIndex+']';
  704.            Container^.DoneItem(Item);
  705.          end { if }
  706.     else GetText := '';
  707. end;
  708.  
  709. {****************************************************************************}
  710. { TStringReader object                                                       }
  711. {****************************************************************************}
  712. {****************************************************************************}
  713. { TStringReader.ExtractText                                                  }
  714. {****************************************************************************}
  715. function TStringReader.ExtractText(Item : Pointer) : PString;
  716. begin
  717.   ExtractText := Item;
  718. end;
  719.  
  720. {****************************************************************************}
  721. { TStringReader.ExtractIndex                                                 }
  722. {****************************************************************************}
  723. function TStringReader.ExtractIndex(Item : Pointer) : Integer;
  724. begin
  725.   ExtractIndex := -1;
  726. end;
  727.  
  728. begin
  729.   Packing := False;
  730. end.